home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-11-02 | 118.5 KB | 2,905 lines |
-
-
-
- - 1 -
-
-
-
- 5. _K_n_o_w_n__P_r_o_b_l_e_m_s__a_n_d__W_o_r_k_a_r_o_u_n_d_s
-
- 5.1 _W_o_r_k_S_h_o_p__D_e_b_u_g_g_e_r
-
- +o The 2.6.5 version of the WorkShop debugger has problems
- evaluating references to class data members and the
- "this" pointer in C++ programs compiled with the 7.1
- and 7.0 versions of the C++ compiler.
-
- Workaround: You can recompile your code using the 7.2
- version of the compiler. These expressions work
- correctly with the output of the 7.2 compiler. If you
- must debug 7.1 or 7.0 generated programs or DSOs, add
- the following line to your .Xdefaults file:
-
- ****uuuusssseeeeOOOOllllddddEEEExxxxpppprrrrEEEEvvvvaaaallll:::: ttttrrrruuuueeee
- ****UUUUsssseeeeOOOOllllddddEEEExxxxpppprrrrEEEEvvvvaaaallll:::: ttttrrrruuuueeee
-
- This will allow you to reference class data members,
- but you will have to reference them as "this->member".
-
-
- +o There is a limitation in the specification of the type
- for a C++ exception trap. The determination as to
- whether a particular type has been thrown does not take
- into account typedefs. For example, given the type
- definition:
-
- ttttyyyyppppeeeeddddeeeeffff cccchhhhaaaarrrr ****SSSSttttrrrriiiinnnngggg;;;;
-
- setting the breakpoint:
-
- ssssttttoooopppp eeeexxxxcccceeeeppppttttiiiioooonnnn SSSSttttrrrriiiinnnngggg
-
- would have no effect.
-
- Workaround: Use the base type specified in the typedef
- when setting the breakpoint.
-
- +o After using cvd's Trap menu to change the setting of
- Group Trap Default or Stop All Default, after an
- extended period a dialog box may display the message
- "Error: No debugger available to set trap modes". This
- can be ignored.
-
- +o When parameter declaration inside a subroutine uses (*)
- type of syntax i.e. character *(*), cvd will not be
- able to display its content correctly. (Incident
- #178191)
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 2 -
-
-
-
- +o Memory leak experiments might fail to unwind the stack
- when particular functions are found in the stack (such
- as usinit() from IRIX 6.2 libc or some libgl
- functions).
-
- Workaround: There is no good workaround for this
- problem.
-
- +o The ability to unwind the call stack using the Call
- Stack View does not work reliably. Stack traces will be
- incomplete when stopped in a signal handler of a 4.X
- binary running on a 5.X or a 6.X system. Returning from
- the signal handler using "step into", "step over" and
- "return" will not work correctly. Similarly,
- registering a signal through sigaction call with the
- SA_SIGINFO flag set may cause incorrect stack traces
- when stopped in the signal handler. (Incident #215151)
-
- Workaround: There is no good workaround for this
- problem.
-
- +o On 5.X, 6.0, and 6.1 systems the debugger has trouble
- detecting mismatches between an executable and core
- file (the problem is resolved on 6.2 systems). If this
- problem occurs, you are likely to receive an incorrect
- stack trace without any warning that the core file may
- not be based on the given executable. (Incident
- #186347)
-
- +o The views that do expression evaluation, Expression
- View, the Evaluate Expression dialog box, Structure
- Browser, Variable Browser, Array Visualizer, and the
- Debugger command line cannot yet evaluate:
-
- - long double (C/C++) and unsigned variants
-
- - real * 16 (Fortran) and unsigned variants
-
- - complex *32 (Fortran) and unsigned variants
-
- Evaluation of these types is not available at this
- time. (Incident #206313)
-
- +o Making an interactive function call when the target
- process is sleeping in a system call will cause the
- target to fault. (Incident #223601)
-
- +o WorkShop does not accommodate text editors other than
- Source View very well.
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 3 -
-
-
-
- Workaround: Set the _e_d_i_t_o_r_C_o_m_m_a_n_d resource in the
- _a_p_p-_d_e_f_a_u_l_t_s file to your desired editor. For example,
- set _e_d_i_t_o_r_C_o_m_m_a_n_d to _w_s_h -_c _v_i +%_d to run _v_i in a _w_s_h
- window. You also need to set *_u_s_e_T_o_o_l_T_a_l_k to _F_a_l_s_e.
-
- +o The request to kill a process which has spawned child
- processes (through _f_o_r_k(), _s_p_r_o_c(), or _s_p_r_o_c_s_p()),
- followed by exiting _c_v_d, may not properly terminate the
- descendant processes. The descendant processes may
- continue to run after _c_v_d has exited. (Incident
- #206273)
-
- Workaround: Kill all of the process group members with
- the Multiprocess View as opposed to using the Main
- View. If any of the descendant processes were created
- through a _f_o_r_k(), you will have had to direct the
- Multiprocess View to attach to _f_o_r_k()ed process (see
- ``Config: Preferences'' in the Multiprocess View).
-
- +o The Multiprocess View is known to occasionally not
- display all process group members which _c_v_d is attached
- to. One condition where this problem occurs is when
- the list of processes shown by the Multiprocess View is
- frequently changing in a short span of time (for
- example, processes are _f_o_r_k()ed which _e_x_e_c() and exit
- shortly after they start). (Incident #244782)
-
- Workaround: Use of Stop in the Multiprocess View will
- cause _c_v_d to stop all process group members and the
- display should change to correctly list all processes.
-
- +o When _c_v_d is brought up on one member of a running
- shared process group (see _s_p_r_o_c(2)), _c_v_d does not
- identify and attach to all of the other processes which
- are members of the shared process group. If you start
- up the Multiprocess View you will only see the process
- you started _c_v_d on. The correct behavior from the
- Multiprocess View would be to display all members of
- the shared process group. (Incident #179940)
-
- Workaround: Use ``Process: Add'' in the Multiprocess
- View to manually add each member of the shared process
- group to the _c_v_d process group display by Multiprocess
- View.
-
- +o Attempts to add a process which has been removed from
- Multiprocess View may fail or lead to an abort of the
- Multiprocess View. (Incident #168934)
-
- +o Disassembly View sometimes has problems when two or
- more DSOs have overlapping text. In such cases,
-
-
-
-
-
-
-
-
-
-
-
- - 4 -
-
-
-
- Disassembly View displays only one of the DSOs from the
- set whose text overlaps. This can happen to users who
- are building their own DSOs. Unfortunately _c_v_d does
- not warn the user when this type of conflict occurs.
- (Incident #204024)
-
- +o On attempting to locate the DSOs used by an executable,
- _c_v_d uses the shell environment in which _c_v_d was
- started, as opposed to the shell environment within the
- Execution View. This means that the value of
- environment variables like LLLLDDDD____LLLLIIIIBBBBRRRRAAAARRRRYYYY____PPPPAAAATTTTHHHH which are
- used by _c_v_d may not match the values in the shell where
- the executable will be run. When _c_v_d is using the
- wrong values for environment variables like
- LLLLDDDD____LLLLIIIIBBBBRRRRAAAARRRRYYYY____PPPPAAAATTTTHHHH, it may have trouble finding all of the
- appropriate DSO symbol tables. When _c_v_d has trouble
- finding DSOs used by an executable it will display the
- Library Search Path dialog to call attention to the
- DSOs which could not be found. (Incidents #224125,
- #236651)
-
- Workaround: Use ``Admin: Library Search Path ...'' to
- examine and set environment variables like
- LLLLDDDD____LLLLIIIIBBBBRRRRAAAARRRRYYYY____PPPPAAAATTTTHHHH which control the identification of
- DSOs.
-
- +o Watchpoints in _c_v_d may be defined with an address and
- size or an expression. If you attempt to watch an
- expression which resides on the stack (for example, a
- local variable) _c_v_d will not allow definition of the
- trap. _c_v_d will only watch expressions whose location
- is within a mapping other than the stack. (Incident
- #197233)
-
- Workaround: If you want to watch an expression which
- resides on the stack, use the expression evaluator to
- find the address of the expression and create the
- watchpoint using the address. Once the expression is
- deallocated, the watchpoint should be removed to avoid
- any confusion when the stack address is reused for some
- other purpose later on in the execution.
-
- +o Process group watchpoints involving expressions are not
- supported well. If you create a watchpoint with a
- command like ppppggggrrrrpppp wwwwaaaattttcccchhhh <<<<eeeexxxxpppprrrreeeessssssssiiiioooonnnn>>>>, the expression is
- only evaluated once on one of the process group
- members. The evaluation is used to determine the
- address and size of the watchpoint, and address and
- size is used to create a watchpoint on each process
- group member. This will only work correctly if the
- address and size of the expression is the same for each
-
-
-
-
-
-
-
-
-
-
-
- - 5 -
-
-
-
- process group member. There is no workaround known for
- this problem. (Incident #143367)
-
- +o The Trap Manager fails to properly define watchpoints
- on 64-bit addresses. The address typed in the
- ``Trap:'' field is corrupted and either a watchpoint is
- created on the wrong address or an invalid address
- error is reported (_W_a_t_c_h_p_o_i_n_t _a_d_d_r_e_s_s _r_a_n_g_e _i_n_c_l_u_d_e_s _a_n
- _i_n_v_a_l_i_d _v_i_r_t_u_a_l _a_d_d_r_e_s_s.). (Incident #235635)
-
- Workaround: The command line interface panel in the _c_v_d
- Main View can be used in place of the Trap Manager to
- enter the watchpoint command.
-
- +o _c_v_d does not have support for weak symbols (see
- Appendix A of the _C _L_a_n_g_u_a_g_e _R_e_f_e_r_e_n_c_e _M_a_n_u_a_l). _c_v_d
- will not recognize the weak symbol name. For example,
- _c_v_d will not accept a request to trap on entry to
- dlopen. (Incident #181409)
-
- Workaround: Use the "strong" symbol name in place of
- the weak one. Many weak symbols defined in libc have
- corresponding "strong" symbol names which are the weak
- name with a ``_'' prepended onto the front. For
- example, the "strong" symbol name for dlopen is
- _dlopen.
-
- +o A write watchpoint may fail to fire when the write
- occurs within a syscall. For example, a write
- watchpoint on one word within a buffer written by read
- may fail to fire.
-
- Workaround: Define the watchpoint to cover the entire
- data structure as opposed to a subset of the structure.
- For example, define the watchpoint over the entire
- buffer being handed to read as opposed to a single
- word.
-
- +o An attempt to step into the first call to an external
- function will behave like a step over. The first call
- to an external function invokes rld to resolve the
- function address. When this occurs the request to step
- into the call will look like a step over to the user.
- (Incident #147302)
-
- Workaround: Either set the environment variable
- _L_D__B_I_N_D__N_O_W to 1 in the Execution View prior to running
- the program (see _r_l_d(1)) or use function entry
- breakpoints.
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 6 -
-
-
-
- +o Traps placed within a parallel Fortran DO loop, created
- with the C$DOACROSS compiler directive, fail to work
- correctly. Although the traps appear to be placed
- correctly on 6.0 systems, the process will not stop on
- the traps. On 5.3 systems the traps cannot be placed
- within the loop at all. (Incident #20818)
-
- Workaround: On a 6.0 system _d_b_x can be used
- successfully to place traps within the loop.
-
- +o The Fortran intrinsics _c_h_a_r, _z_e_x_t, _s_e_c_o_n_d_s, _m_a_l_l_o_c, and
- _e_p are not supported. (Incident #206293)
-
- +o The debugger does not understand external or intrinsic
- statements in the Fortran program. If the program has
- a function by the same name as an intrinsic function,
- evaluating an expression involving that function will
- always cause the program function to be called.
-
- +o Some of the intrinsics (_s_q_r_t, _e_x_p, _l_o_g, _l_o_g_1_0, _s_i_n,
- _c_o_s, _t_a_n, _a_s_i_n, _a_c_o_s, _a_t_a_n, _s_i_n_h, _c_o_s_h, _t_a_n_h) do not
- give the correct results when the debugged executable
- is linked with _l_i_b_m._s_o. This is because of entry
- points with similar names in _l_i_b_m._s_o.
-
- Workaround: Use a specific intrinsic name. For
- example, _s_i_n(_r_1) where _r_1 is real will produce
- incorrect results. On the otherhand, _d_s_i_n(_d_f_l_o_a_t(_r_1))
- will give correct results, with the results being a
- _r_e_a_l *_8 quantity.
-
- +o Stopping in the entry prologue of a function (before
- the first user statement) in a Fortran program and
- evaluating an expression that involves an adjustable
- array or displaying an adjustable array in the Array
- Visualizer will not work correctly. (Incident #206264)
-
- Workaround: Step to the first user statement and
- evaluate the expression.
-
- +o When stopped in a Fortran function/subprogram that has
- alternate entry points, the debugger will not list all
- the arguments of the subprogram and their values
- correctly. (Incident #164327)
-
- +o For global lookups, _c_v_d acts as though all DSOs are
- built ----BBBB ssssyyyymmmmbbbboooolllliiiicccc. If a process is stopped within a
- DSO and the user asks _c_v_d to lookup a global variable
- or function, _c_v_d will always look within the DSO before
- it considers the main program or any other DSO. In
- effect, _c_v_d is acting as if each DSO has been built
-
-
-
-
-
-
-
-
-
-
-
- - 7 -
-
-
-
- with ----BBBB ssssyyyymmmmbbbboooolllliiiicccc. (Incidents #173343)
-
- +o Interactive calls to inline member functions of C++
- classes is not supported.
-
- +o There is no support for C++ overloaded operators in the
- expression evaluator. (Incident #203968)
-
- +o The debugger does not have full support for C++
- templates. However, the user can stop in template code
- and print the ``this'' pointer. (Incidents #140313,
- #140316, #222352)
-
- +o The display format for describing an array pointer
- types is incorrect. For example, an array of
- double(*)[2] is expressed as double[]*.
-
- +o Elements of Fortran arrays with more than 6 dimensions
- (or 5 dimensions, if the element type is character
- string) cannot be referenced.
-
- +o C++ objects containing virtual base classes do not
- display correctly in the expression evaluator.
- (Incident #190170)
-
- +o _c_v_p_c_s can stack trace through assembler alternate entry
- functions only when they are at the same address as the
- main entry point. Assembler functions with arbitrary
- alternate entry points will produce incorrect stack
- trace.
-
- +o When the Trap Manager is invoked, traps are
- automatically loaded from the ._c_v_T_r_a_p_M_g_r file if one
- exists. However, these traps are reloaded if the Trap
- Manager is closed and restarted. (Incident #79217)
-
- Workaround: The Trap Manager should either be left
- running or the default traps should be stored in a
- different file and reloaded manually when desired.
-
- +o In general, when a write watchpoint fires, the write is
- simulated by the debugger to show the new value before
- any trap conditional is evaluated. The four exceptions
- for this case are the SC, SCD, SDL, and SDR
- instructions. (Incident #250036)
-
- +o A kernel bug prevents watchpoints from firing reliably
- for members of share process groups (such as Power
- Fortran or Power C programs). Watchpoints work
- reliably for non-shared text and data segments in each
- individual process.
-
-
-
-
-
-
-
-
-
-
-
- - 8 -
-
-
-
- +o If you stop a process through job control, the debugger
- may not display an accurate status of the process, and
- process control requests do not take effect until the
- process is resumed through job control. A process is
- stopped through job control with <Ctrl-Z> from the
- shell or when it receives one of the signals: SIGSTOP,
- SIGTSTP, SIGTTIN, and SIGTTOU. A process is resumed
- through job control with _f_g and _b_g from the shell or
- when it receives the signal SIGCONT. If a running
- process is stopped through job control, the debugger
- continues to show that the process is running. When
- attaching to a process stopped through job control, the
- debugger shows that the process is stopped. (Incident
- #167693)
-
- +o For instrumented executables (used for performance
- analysis), stack frame unwinding may be incomplete when
- stopped in a signal handler; the unwinding may stop
- prematurely after the ``_sigtramp'' frame. (Incident
- #71307)
-
- Workaround: A full stack trace may be maintained by
- returning past the ``_sigtramp'' frame.
-
- +o The demo program _j_e_l_l_o cannot be built as described in
- the tutorial without the library /_u_s_r/_l_i_b/_l_i_b_g_l._s_o.
-
- Workaround: This library should be installed when IRIX
- is installed (eoe1.sw.gfx_lib subsystem).
-
- +o Processes that use the blocking capabilities as
- provided by _b_l_o_c_k_p_r_o_c(2) may not terminate as expected
- upon completion of a debug session. Such processes are
- left in a blocked state with a SIGKILL pending.
-
- Workaround: These processes can be terminated with
- _k_i_l_l(1).
-
- +o The modification of an inactive trap will cause the
- trap to become active. You will have to toggle the
- active button next to the trap description in order to
- deactivate the trap. (Incident #190278)
-
- +o There is a case where the path remapping component of
- WorkShop will find the wrong file. When _c_v_d is stopped
- and started multiple times, and ``Admin:Exit'' was used
- to exit _c_v_d, the path remapping component will retain
- entries in its Substitution Set from each debugging
- session (see ``Admin:Project:Remap Paths...''). The
- path remapping component of _c_v_d is implemented as a
- separate process and the ``.'' entry in the
-
-
-
-
-
-
-
-
-
-
-
- - 9 -
-
-
-
- Substitution Set refers to the directory in which the
- process was started, typically the directory were the
- first _c_v_d was started.
-
- Workaround: Use ``Admin:Project:Exit'' in place of
- ``Admin:Exit''. This will force the path remapping
- process to terminate on each exit of _c_v_d.
-
- +o By default the debugger will not attach to a _f_o_r_k()ed
- process unless the fork occurs during an interactive
- function call. If you have used the Multiprocess View
- preferences dialog to prevent a forked child from being
- resumed, and you make an interactive function call will
- leads to a call on fork, the child process will be left
- stopped on exit from fork. You must now use the
- Multiprocess View to resume the child process.
- (Incident #190308)
-
- +o _c_v_d may fail to recognize that a DSO source file is
- newer than the DSO. Although such a source file may be
- the wrong version for the code which is executing, _c_v_d
- will not issue a warning. The source of the problem is
- that _c_v_d is always comparing time of last modification
- for the source file against the executable when it
- should be comparing against the DSO. (Incident
- #181297)
-
- +o Fortran COMMON block members that are at an offset
- greater than 8 Megabytes from the start of the common
- block will not be evaluated correctly in an expression.
-
- +o When using the Switch Process dialog to attach to an
- existing process, don't attach to one of the CaseVision
- or WorkShop processes (e.g. _c_v_p_a_t_h_R_e_m_a_p, _c_v_m_a_i_n) or the
- environment may hang. Should this happen, kill the
- _c_v_m_a_i_n process and start over.
-
- +o Occasionally, _c_v_m_a_i_n will dump core at startup if you
- have an executable with a mismatched core file and your
- NetLS license is within 90 days of expiring. If this
- happens, restart _c_v_d.
-
- +o The request to print the content of a very large data
- structure (such as an array) from within the main
- window's command line interface panel may lead to an
- abort of _c_v_d. (Incident #227980)
-
- Workaround: The Array Browser may be used to display
- very large arrays.
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 10 -
-
-
-
- +o The main window's command line interface panel will
- only display the first 100 elements of an array. There
- is no way to change this behavior. (Incident #250028)
-
- Workaround: The best way to examine an array is the
- Array Browser.
-
- +o With an executable built with the DCC compiler,
- attempts at retrieving symbolic information about
- _o_s_t_r_e_a_m may lead to an abort of _c_v_p_c_s. Entering the
- command wwwwhhhhaaaattttiiiissss oooossssttttrrrreeeeaaaammmm in _c_v_d will lead to such an
- abort. (Incident #239838)
-
- +o The _c_v_p_c_s component of _c_v_d is known to abort on very
- large COFF format executables. (Incident #244495)
-
- +o The command line interface panel in the _c_v_d Main View
- may fail to evaluate expressions when the process is
- stopped and the language of the current context is
- Assembler. (Incident #246294)
-
- Workaround: The Expression View can be used in place of
- the command line interface panel.
-
- +o After a process has stopped, an expression value may
- become invalid due to evaluation of another expression
- or use of debugger commands which can lead to
- modification of expression values. An example would be
- the value of a variable displayed in Expression View
- which is not recalculated after the variable is updated
- with the _a_s_s_i_g_n command in the command line interface
- panel. (Incident #247050)
-
- Workaround: Force the value of the expression to be
- recalculated by retyping the expression.
-
- +o The Array Visualizer will no longer implicitly use _t_h_i_s
- on a C++ program. When attempting to display the
- member of a class you will have to explicitly include
- _t_h_i_s-> along with the name of the member. (Incident
- #248882)
-
- +o Use of the division, and modulus operators in the
- ``Indexing Expression:'' field of the Array Visualizer
- may not work correctly on 64-bit executables.
- (Incident #249262)
-
- +o On startup _c_v_d connects to an underlying process
- control server. Due to a change in WorkShop 2.4, when
- _c_v_d is using a version of the communication protocol
- which is incompatible with the version used by the
-
-
-
-
-
-
-
-
-
-
-
- - 11 -
-
-
-
- server it can no longer recognize the condition and
- report the incompatible version numbers. As in
- previous versions of WorkShop, _c_v_d will exit, but it
- will no longer report the mismatch of communication
- protocol versions. (Incident #233399)
-
- +o _c_v_d may not list all the member functions of a class
- correctly when the class and its member functions are
- built into a separate DSO. (Incident #249733)
-
- +o If the application uses the isolate process (or CPU
- pinning) feature of IRIX, the thread pinned to a
- specific CPU cannot be debugged. The isolate process
- feature is accessed by a call to _s_y_s_m_p(_M_P__I_S_O_L_A_T_E).
- (Incident #216158)
-
- Workaround: Disable calls to _s_y_s_m_p(_M_P__I_S_O_L_A_T_E) to
- enable debugging.
-
- +o Occasionally, path remapping will cease to function
- properly: new entries in the list will not take
- immediate effect, yet if you exit and restart _c_v_d, they
- will apply. (Incident #247133)
-
- Workaround: Exit _c_v_d and kkkkiiiillllllllaaaallllllll ttttttttsssseeeessssssssiiiioooonnnn.
-
- +o _c_v_d cannot evaluate expressions involving local classes
- (classes that are defined inside of a function).
- (Incident #212268)
-
- +o The Query menu within _c_v_d will fail to operate
- correctly if _c_v_d was attached to a running process (ccccvvvvdddd
- ----ppppiiiidddd ............) or if _c_v_s_t_a_t_i_c is started by hand (``Admin:
- Launch Tool -> Static Analyzer''). (Incident #238595)
-
- +o A trap at the closing brace of a C/C++ function may not
- be defined properly. This is known to occur when the
- last statement of the function is a return statement.
- When this problem occurs the trap is defined on a
- source line following the closing brace, typically the
- opening brace of the next function.
-
- Workaround: Place the trap on the source line
- containing the return statement as opposed to the line
- containing the closing brace. (Incident #277136)
-
- +o _c_v_d may close file descriptors it should leave open in
- the _r_u_n command. All file descriptors at 3 and above
- are closed by _c_v_d. (Incident #277295)
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 12 -
-
-
-
- +o The Structure Browser is known to abort when asked to
- display more than 100 elements of a linked list.
- (Incident #278140)
-
- +o The _c_v_p_c_s component of _c_v_d is known to occasionally
- abort on erroneous expression evaluation requests from
- the one-time expression evaluation component of _c_v_d.
- (Incident #282160)
-
- +o Evaluation of a C++ expression which contains a
- variable whose name is the same as that of a structure
- may lead to an erroneous error. (Incident #286949)
-
- +o When stopped at the entry to a function compiled N32 or
- 64-bit the debugger's Call Stack View does not always
- report the correct arguments to that function. Usually
- the arguments will be correct after stepping one or
- more lines into the function.
-
- +o Under some conditions, on some R5K Indy and O2
- machines, a hardware problem may cause traps to not
- fire the first time they are encountered. Rerun often
- works around the problem (Incident #439770).
-
- 5.1.1 _D_e_b_u_g_g_i_n_g__6_4_-_b_i_t__a_n_d__N_3_2__C_+_+__p_r_o_g_r_a_m_s This section
- discusses problems that are unique to debugging 64-bit and
- N32 C++ programs. (The problems discussed in the previous
- section may also apply to 64-bit and N32 C++ debugging.)
-
- The first two problems on the following list are limitations
- of this release of the debugger; they will be fixed in a
- future release. The remaining problems will be fixed by a
- future release of the C++ compiler.
-
- +o Interactive function calls to member functions cannot
- be performed through objects of the class using the ->
- or . access operators.
-
- Workaround: Perform the interactive function call using
- the class-qualified name. In such a call, the _t_h_i_s
- parameter must be passed explicitly.
-
- ccccllllaaaassssssss nnnnooooddddeeee {{{{
- nnnnooooddddeeee ****____rrrriiiigggghhhhtttt;;;;
- nnnnooooddddeeee ****____lllleeeefffftttt;;;;
- ppppuuuubbbblllliiiicccc::::
- nnnnooooddddeeee(((())));;;;
- nnnnooooddddeeee**** rrrriiiigggghhhhtttt(((())));;;;
- nnnnooooddddeeee**** lllleeeefffftttt(((())));;;;
- }}}};;;;
- nnnnooooddddeeee ****nnnn;;;;
-
-
-
-
-
-
-
-
-
-
-
- - 13 -
-
-
-
- In this example, the member functions cannot be called
- as _n->_r_i_g_h_t() or _n->_l_e_f_t(). Instead, they must be
- called as _n_o_d_e::_r_i_g_h_t(_n) or _n_o_d_e::_l_e_f_t(_n).
-
- +o The _t_h_i_s parameter is not explicitly dereferenced in
- member functions.
-
- Workaround: Access members of the _t_h_i_s parameter in a
- member function by using the _t_h_i_s-> accessor.
-
- +o There is no debugging output for anonymous unions
- declared in a block. (Incident 236926)
-
- +o Static data members cannot be accessed using the -> or
- . access operators. (Incident 237006)
-
- Workaround: Access static data members using the
- class-qualified name.
-
- +o Static member functions cannot be accessed using the ->
- or . access operators, or by using the class-qualified
- name. (Incident 237029)
-
- Workaround: Access static member functions using only
- the name of the member function; do not use the class-
- qualified name.
-
- +o Nested C++ classes appear as global classes. (Incident
- 242800)
-
- +o The tag for nested C++ structures is incorrect.
- Instead of the correct tag name, the C++ mangled name
- is used. (Incident 244522)
-
- +o The type is incorrect for point-to-member variables.
- Instead of having the correct pointer-to-member type,
- these variables have the type of the member to which
- they're pointing. (Incident 249844)
-
- +o The definition of a template class instantiation does
- not include the member functions. (Incident 249849)
-
- Workaround: A member function definition for a template
- class instantiation may be printed out using the
- class-qualified name, prefixed by the template argument
- list. For example, consider the following code segment:
-
- tttteeeemmmmppppllllaaaatttteeee<<<<ccccllllaaaassssssss TTTT>>>> ccccllllaaaassssssss vvvveeeeccccttttoooorrrr {{{{
- TTTT**** vvvv;;;;
- iiiinnnntttt sssszzzz;;;;
- ppppuuuubbbblllliiiicccc::::
-
-
-
-
-
-
-
-
-
-
-
- - 14 -
-
-
-
- vvvveeeeccccttttoooorrrr((((iiiinnnntttt))));;;;
- TTTT&&&& ooooppppeeeerrrraaaattttoooorrrr[[[[]]]]((((iiiinnnntttt))));;;;
- }}}};;;;
- vvvveeeeccccttttoooorrrr<<<<iiiinnnntttt>>>> vvvv1111((((22220000))));;;;
-
- In this example, the global names of the member
- functions are <_i_n_t>_v_e_c_t_o_r::_v_e_c_t_o_r and
- <_i_n_t>_v_e_c_t_o_r::_o_p_e_r_a_t_o_r[].
-
- 5.1.2 _D_e_b_u_g_g_i_n_g__P_r_o_g_r_a_m__G_r_o_u_p_s__I_n_c_l_u_d_i_n_g__a__S_e_t_-_u_i_d__P_r_o_g_r_a_m
- Because of standard IRIX security policies, the debugger can
- not debug a program running as another user (unless you are
- logged in as _r_o_o_t). This restriction applies even to system
- programs which are set-UID, and even when all you want to do
- with the set-UID program is debug something that it in turn
- runs. It is common to use the system-provided set-UID
- program _x_w_s_h (or _w_i_n_t_e_r_m, which in turn runs _x_w_s_h) in this
- way.
-
- There are two basic ways to deal with this problem. You can
- become _r_o_o_t before starting your debugging session, which
- grants you all necessary access rights (but may be
- infeasible for your application or situation). Or, you can
- arrange to use a non-set-UID copy of the intermediary
- program, for example with _c_h_m_o_d, or by making a copy of the
- program with _c_p.
-
- There is also a bug in the IRIX 6.0 version of _x_w_s_h which
- makes it unreliable if run non-set-UID. You may be able to
- use _x_t_e_r_m instead of _x_w_s_h for these applications, for
- example by using _w_i_n_t_e_r_m and setting the environment
- variable WWWWIIIINNNNTTTTEEEERRRRMMMM to xxxxtttteeeerrrrmmmm before starting your debugging
- session (and providing a non-set-UID copy of _x_t_e_r_m).
-
- If your application depends on features of _x_w_s_h, can not use
- _x_t_e_r_m instead, and can not be run as _r_o_o_t, then this
- procedure will generally ensure that you can debug as non-
- root:
-
- +o Make a non-set-uid copy of _x_w_s_h (ccccpppp ////uuuussssrrrr////ssssbbbbiiiinnnn////xxxxwwwwsssshhhh ....).
-
- +o Start several _x_w_s_h or _x_t_e_r_m windows, as the user who
- will be doing the debugging. Exit them all. It is
- important that they all be started together, all be
- running at once, and then be exited immediately before
- the debugging session begins.
-
- +o Debug your application.
-
- +o Set one or more breakpoints by function name ("stop in
- main"), in the syscall panel, or with the ``Traps: Stop
-
-
-
-
-
-
-
-
-
-
-
- - 15 -
-
-
-
- at Function Entry'' menu - not by clicking in the glyph
- bar of the main window. (Traps set on a particular
- source line, as by clicking, are not copied from one
- program to the next.)
-
- +o Bring up the MPView, from the Admin menu.
-
- +o Be sure all the "copy traps...." boxes are checked in
- its configuration dialog.
-
- +o Run your application, using MPView's ``Continue''
- button as necessary and watching MPView for the
- appearance of your subprocess. Double-click it to
- launch a debugger on it.
-
-
- 5.2 _W_o_r_k_S_h_o_p__F_i_x_+_C_o_n_t_i_n_u_e
-
- 5.2.1 _L_i_m_i_t_a_t_i_o_n_s__o_f__F_i_x_+_C_o_n_t_i_n_u_e
-
- +o You cannot add or delete global variables or functions.
-
- +o You are restricted to editing the bodies of existing
- non-inline functions. If you attempt to edit an inline
- function, no warnings are emitted, but the results are
- unpredictable.
-
- Incident 240481
-
- +o You cannot modify a function while the program is
- sleeping in a system call, or is stopped on entry to a
- system call. The debugger will detect this condition
- and prevent you from loading the modified function
- until you return from the system call.
-
- You can set a trap on exit from the system call using
- the System Call panel of cvd and continue the program
- in order to get to a point where function loading is
- allowed.
-
- Incident 244664
-
- +o The Multiprocess View capability of the debugger does
- not interact well with the Fix and Continue feature.
- sproc'ed and forked processes inherit the new
- redefinition of the function. However, when starting a
- debugger session on the new process, the debugger is
- not aware that the process contains function
- redefinitions. This means that there is no way to
- deactivate the new definition in the new process after
- a sproc() or a fork(). If the new function definition
-
-
-
-
-
-
-
-
-
-
-
- - 16 -
-
-
-
- is not desired in the new process, it is necessary to
- stop the process on entry to fork() or sproc(),
- deactivate the modified function and activate it again
- on exit from fork() or sproc().
-
- +o Performance Analysis and Fix and Continue are mutually
- exclusive operations. You should not run a performance
- experiment after you have modified a function. In most
- cases, the debugger will detect attempts to mix
- Performance Analysis and Fix and Continue operations,
- and prevent them.
-
- Incident 245326
-
- +o The Fix and Continue feature is not supported for code
- compiled with the Delta/C++ (DCC) compiler. The current
- implementation does not detect this problem.
-
- +o Fix and Continue can only be used on ELF executables
- compiled in shared mode. Fix and Continue is
- implemented by using the dynamic loader, which is not
- available in COFF or non-shared ELF executables.
-
- Incident 243574
-
- +o Fix and Continue is only supported on IRIX 5.3. In
- particular, Fix and Continue is not supported on IRIX
- 5.2 and IRIX 6.x.
-
- 5.2.2 _K_n_o_w_n__P_r_o_b_l_e_m_s__w_i_t_h__F_i_x__a_n_d__C_o_n_t_i_n_u_e
-
- +o The Disassembly View has not been updated to work with
- the Fix and Continue feature. As a result, you will
- notice the following behavior when viewing a modified
- function in Disassembly View:
-
- +o The filename displayed is incorrect, and reflects
- the name of the temporary file used by the Fix and
- Continue mechanism.
-
- +o The assembly instructions are not interleaved with
- the source code.
-
- +o The line numbers shown in Disassembly View do not
- reflect the line numbers used in the rest of the
- debugger (i.e., instead of "7.3", the Disassembly
- View will say line "9").
-
- Incident 243635
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 17 -
-
-
-
- +o The initialization value of local statics in C may not
- be modified. If you make such a change, it will
- silently be ignored. Since you are permitted to add new
- local statics, you can accomplish a change of the
- initialization value using the following workaround:
-
- /* Original function */
- void f() {
- static int i = 0; /* oops. This should be -1 */
- }
-
- /* New function */
- void f() {
- static int i = 0; /* oops. This should be -1 */
- static int first_time = 1;
- if (first_time) {
- i = -1;
- first_time = 0;
- }
- }
-
- Incident 246306
-
- +o In C it is legal to call a function without declaring
- it, and later declare the function to be static. For
- example:
-
- main(){
- f();
- return 0;
- }
-
- static int f(){
- }
-
- Since the Fix and Continue feature will only compile
- "main", and since there is no declaration for "f", the
- compiler will assume that "f" is an external function,
- and there will subsequently by a "Load Error" in the
- Interpreter Message window since the runtime loader
- will be unable to find an external definition for "f".
- The workaround is to make sure the compiler knows that
- "f" is static when you use modify "main" during a Fix
- and Continue operation:
-
- main(){
- static int f();
- f();
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
- - 18 -
-
-
-
- Incident 246317
-
- +o When executing an older version of a function, you will
- see the most recent source in the source window.
- Consequently the line numbers, PC highlight, and
- breakpoints displayed may be on the wrong lines.
-
- +o If you open a source file using "Source:Open...", the
- source file is opened in "Editable" mode by default.
- This prevents Fix and Continue operations on the file,
- and you will see the "Fix+Continue" button grayed out.
- If you wish to use Fix and Continue on this file, use
- the "Source:Make Read Only" menu option. If you use
- "Source:Open..." to open a source file in which you
- have previously modified functions, the modified
- functions will not be highlighted while the source file
- is editable.
-
- If you save a file in which some changes were made
- using Fix and Continue, and some changes were made
- using "Source:Open...", confusion may occur. You can
- workaround this by using "Source:Make Editable"
- followed by "Source:Make Read Only". Another workaround
- is to switch to some other file and then switch back to
- the current file. Switching back can be accomplished by
- making the process stop in the file or by using
- "Source:Open..." followed by "Source:Make Read Only".
-
- Incidents 243627, 243629, 248842
-
- +o If you are stopped in a program, and you modify a
- function which is not the one you are stopped in, after
- the "Parse And Load" completes your source is
- repositioned at the line on which you are stopped,
- rather than at the function you just modified.
-
- Incident 246739
-
- +o When a "Parse and Load" is performed, a compiler is
- invoked to compile the modified function. Before
- performing the compile, the compilation process will do
- a "cd" so that the compilation takes place in the same
- directory as the original file was compiled in. This
- "cd" operation does not currently take path remapping
- into account, so you will have problems when you
- attempt to use "Fix and Continue" on an executable
- which was built on a different machine. The workaround
- is to make sure that you use "Fix and Continue" on an
- executable in the same environment as the one it was
- built in. Another alternative is to adjust the command
- line options on the compile command (using the Build
-
-
-
-
-
-
-
-
-
-
-
- - 19 -
-
-
-
- Environment window) so that they will work in the
- debugging environment.
-
- Incident 246189
-
- +o The Fix and Continue mechanism does not currently check
- to make sure that a file has not been modified after it
- was last compiled. If you modify a function using Fix
- and Continue, save the source back to its original
- file, and forget to rebuild your application after
- exiting the debugger, you will see unpredictable result
- if you re-enter the debugger and attempt to use Fix and
- Continue. For example, the debugger may think that
- function "f" is on lines 15 to 20, whereas your
- previous changes may have repositioned the function on
- lines 17 to 22. When you select "Fix+Continue:Edit" if
- you notice that the edit region does not cover the
- entire body of the function, you should exit the
- debugger and rebuild your application.
-
- Incident 245098
-
- +o If your original build compiled multiple files with a
- single command line, this same command line will be run
- when using Fix and Continue to modify a function in any
- of those files, causing unnecessary recompilations of
- the other files, and possibly erroneous results. For
- best results, compile files one at a time using the -c
- option of the compiler. If this is not possible, use
- the Build Environment view to modify the command line
- and remove all file names from it (Fix and Continue
- will add in the file actually being compiled
- automatically).
-
- +o When you use the "Fix and Continue->Edit" menu item,
- the region you are allowed to edit begins with the line
- containing the first "{" of your function. This line
- would include the line containing the function and
- parameter declaration, for the coding style shown
- below:
-
- void f(int y){
- /* .... */
- }
-
- In such cases, you should make sure you do not change
- the function name and parameter profile. The
- implementation does not currently check that you do not
- make such changes, but you may receive a message like
- this:
-
-
-
-
-
-
-
-
-
-
-
-
- - 20 -
-
-
-
- No reply from PCS;
- unknown error while loading dso for the modified function
-
- Incident 245299
-
- +o If a "stop exit" trap is placed in a function, and Fix
- and Continue is used on the function after hitting the
- exit trap, then if execution can continue in the new
- function, the PC is moved back to the beginning of the
- line (it is in the epilogue, at the "jr ra"
- instruction). This means the epilogue is re-executed.
- This could cause problems if the stack pointer has
- already been decremented, because now it will get
- decremented twice. Your program may occasionally work
- if the stack decrement happens to be after the "jr ra"
- instruction. The implementation currently does not
- always detect this condition.
-
- The workaround is to reposition the PC at the "jr ra"
- using PC->JumpTo after your F&C has completed.
-
- F&C and templates
-
- +o Using F&C on functions which use templates are not
- completely supported in this release. Typically, if the
- change involves instantiating new functions, then such
- a change is not supported in this release. If the
- process is stopped when this change is made, the F&C
- error message window will display the error message
- from rld under the PCS error messages. Otherwise, views
- would temporarily show that the change is ok, but when
- the process is run later , load error message will be
- reported and the change is switched back to edited
- state.
-
- The error message would be something like: :
- 26095:/tmp_mnt/hosts/xanadu/usr/people/pal/kim/mnm:
- rld: Fatal Error: unresolvable symbol in
- /var/tmp/cvintp26042/cvfn1.3.so:
- static_allocator__15vector__pt__2_i
-
- Incident 249309
-
-
- 5.3 _W_o_r_k_S_h_o_p__M_o_t_i_f__A_n_a_l_y_z_e_r
-
- +o The Motif Analyzer requires IRIX 5.3 or later for
- correct operation. The instrumented libraries have
- been tested on older versions of IRIX and may result in
- compatibility problems with other shared libraries.
-
-
-
-
-
-
-
-
-
-
-
-
- - 21 -
-
-
-
- +o The Motif Analyzer may produce unexpected results when
- used with an application compiled on a pre-IRIX 5.3
- system using static libraries, and with non-Motif (e.g.
- Xaw) applications. In particular, the widget selection
- and widget tree functionality may not work.
-
- +o The instrumented, debug Motif library shipped with the
- MegaDev.sw.motif subsystem and installed in
- /usr/lib/WorkShop/Motif contain the IRIX 5.3 version of
- motif_eoe.sw.eoe up to and including patch 258. If you
- are debugging a Motif-related problem in your
- application and the problem is not reproducible using
- the instrumented Motif library in
- /usr/lib/WorkShop/Motif, it may be fixed with the patch
- 258 version of motif_eoe.sw.eoe.
-
- +o If you create traps in the Motif Analyzer window using
- the Breakpoints examiner, trap items will appear in the
- Trap Manager window of the WorkShop Debugger. These
- items will be labeled "MotifBreak." You should not
- attempt to modify or delete these traps using the Trap
- Manager. Instead, always use the Breakpoints examiner
- to modify or delete your Motif-related breakpoints.
-
- +o If you install the MegaDev.sw.motif subsystem and then
- reinstall the WorkShop.sw.cvd subsystem, the "Motif
- Analyzer" item will disappear from the Views menu in
- the WorkShop Debugger. Reinstalling the
- MegaDev.sw.motif subsystem will correct the problem.
-
- +o If you install the WorkShop.sw.cvd and MegaDev.sw.motif
- subsystems, and then remove only the MegaDev.sw.motif
- subsystem, the "Motif Analyzer" menu item will still
- exist in the Views menu in the WorkShop Debugger.
- Selecting this menu item, however, will result in an
- error dialog. Reinstalling the WorkShop.sw.cvd
- subsystem will remove the item from the Views menu.
-
- +o Occasionally, the Motif Analyzer display will remain
- inactive after switching between processes using
- WorkShop's "Switch Process" or "Switch Executable" menu
- items, or when rerunning the process after changing the
- command arguments. If this happens, close the Motif
- Analyzer window and use WorkShop's Views menu to bring
- it up again.
-
- +o If your application connects to a remote X display and
- you do not set LD_LIBRARY_PATH to include
- /usr/lib/WorkShop/Motif, any Editres-type operations
- (e.g. widget select and widget tree) will operate on
- the local display and not work correctly. Either run
-
-
-
-
-
-
-
-
-
-
-
- - 22 -
-
-
-
- your program using the local X display or change
- LD_LIBRARY_PATH as advised.
-
- +o A small number of applications build their widget
- hierarchy in such a way that Editres widget selection
- operations cause them to exit with an X error. If your
- application falls into this category, then using the
- Motif Analyzer widget select functionality will cause
- the same thing to happen.
-
-
- 5.4 _W_o_r_k_S_h_o_p__B_u_i_l_d__A_n_a_l_y_z_e_r
-
- If target or dependency names are specified using
- parentheses to denote files stored within an archive
- library, _c_v_b_u_i_l_d will use a single node to represent the
- archive library, rather than individual nodes for each file
- within it.
-
-
- 5.5 _W_o_r_k_S_h_o_p__S_t_a_t_i_c__A_n_a_l_y_z_e_r
-
- 5.5.1 _G_e_n_e_r_a_l__K_n_o_w_n__P_r_o_b_l_e_m_s
-
- +o The Directory Query "List Files" works only when the
- query target is a full path name of a directory. For
- example, it works on the target "/usr/include", but not
- on a target like "include".
-
- Workaround: Select the General Option "Full Pathnames".
- Then any directory names displayed will contain full
- paths, and so the "List Files" query will cork on them
- correctly.
-
- +o If you use _c_v_s_t_a_t_i_c to analyze a fileset and then
- change one or more of the header files included by the
- files in the fileset, rescanning the fileset will not
- detect the change. Rescanning only detects changes to
- source files listed in the fileset. Similarly, if you
- remove a source file from a fileset and rescan, the
- header files included by that file are not removed from
- the database. (Incident #179731)
-
- Workaround: If you have changed one or more files in a
- fileset (or included by files in a fileset), you can
- get a consistent database by selecting ``Force Scan''
- from the Admin menu.
-
- +o Some printers may clip the output when printing a
- PostScript version of graph saved by _c_v_s_t_a_t_i_c.
-
-
-
-
-
-
-
-
-
-
-
-
- - 23 -
-
-
-
- Workaround: None, except trying another printer, or
- re-laying out the graph by hand to avoid clipping.
-
- 5.5.2 _K_n_o_w_n__P_r_o_b_l_e_m_s__w_i_t_h__M_i_x_e_d__L_a_n_g_u_a_g_e_s
-
- +o If you analyze a program that contains both Fortran and
- C routines, _c_v_s_t_a_t_i_c in scanner mode does not recognize
- that the C function ffffoooooooo____ and the Fortran function ffffoooooooo
- refer to the same routine. In parser mode, _c_v_s_t_a_t_i_c
- will identify the routines correctly, if it analyzes
- the C file containing ffffoooooooo____ before the Fortran file that
- calls ffffoooooooo. So, make sure that your C files appear
- earlier in the fileset than your Fortran files.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 24 -
-
-
-
-
- 5.5.3 _G_e_n_e_r_a_l__K_n_o_w_n__P_r_o_b_l_e_m_s__i_n__S_c_a_n_n_e_r__M_o_d_e
-
- +o In general, _c_v_s_t_a_t_i_c does not require code to be able
- to be compiled. _c_v_s_t_a_t_i_c should provide useful
- information even when code has syntax errors. However,
- there are several requirements that must be met for
- _c_v_s_t_a_t_i_c to work properly. In C and C++, _c_v_s_t_a_t_i_c
- relies on the existence of matching braces to determine
- the beginning and ending of blocks and bodies of
- functions. In Fortran, _c_v_s_t_a_t_i_c relies on the existence
- of matching end statements. Functions without closing
- braces, or end statements, or code with too many end
- statements or mismatched braces can cause unpredictable
- results. In C, it may be necessary to use _c_v_s_t_a_t_i_c's
- ----pppprrrreeeepppprrrroooocccceeeessssssss option with heavily _i_f_d_e_f'd code to achieve
- matched braces.
-
- If any of these limitations of scanner mode keeps
- _c_v_s_t_a_t_i_c from being useful, using parser mode may be
- the right solution.
-
- +o _c_v_s_t_a_t_i_c accepts regular expressions in nearly all
- fields. This can occasionally cause problems if you
- unintentionally use a pattern without realizing it is a
- regular expression. For example, specifying a filename
- of ffffoooooooo....cccc++++++++ usually fails, because ++++ is a special
- character in regular expressions.
-
- Workaround: Backslash all regular expression special
- characters when not used to specify a wildcard pattern.
- For example, the filename mentioned above would be
- entered as ffffoooooooo....cccc\\\\++++\\\\++++.
-
- +o The _c_v_s_t_a_t_i_c Variable query, ``Who Sets'' recognizes
- only variable assignments that use ``='' to assign
- directly to a variable. This query does not recognize
- or account for aggregate initialization statements in C
- or C++, references in C++, assignments made as a result
- of passing or operating on pointers in C, or data,
- equivalence, common, or assign statements in Fortran.
-
- Workaround. Use ``Who References'' to see all locations
- in which the variable is used and to visually inspect
- for assignments.
-
- +o By default, _c_v_s_t_a_t_i_c does not honor _i_f_d_e_f's in source
- code. Much of the time, this is desirable behavior.
- _c_v_s_t_a_t_i_c allows you to find _a_l_l references that satisfy
- a query. However, this may result in an incorrect or
- misleading function call tree. Heavily _i_f_d_e_f'd code may
-
-
-
-
-
-
-
-
-
-
-
- - 25 -
-
-
-
- also confuse _c_v_s_t_a_t_i_c, because (in C) _c_v_s_t_a_t_i_c relies
- on matching braces to detect the end of functions.
-
- Workaround: Use the ----pppprrrreeeepppprrrroooocccceeeessssssss flag when starting
- _c_v_s_t_a_t_i_c. This makes _c_v_s_t_a_t_i_c run much more slowly, but
- it honors most _i_f_d_e_fs.
-
- +o _c_v_s_t_a_t_i_c recognizes many common C, C++, and Fortran
- language patterns. However, all three languages allow
- programmers to write code that is not easily identified
- by patterns.
-
- Workaround: If you find that _c_v_s_t_a_t_i_c misses or
- misidentifies parts of a program, you can usually
- resort to string, regular expression, or symbol queries
- to find the information you are looking for.
-
- +o Files containing very long lines are not handled in
- scanner mode. If a file contains any line longer than
- 3000 characters, _c_v_s_t_a_t_i_c's scanner will fail.
-
- Workaround: Use parser mode, or shorten your source
- lines.
-
- 5.5.4 _K_n_o_w_n _P_r_o_b_l_e_m_s _U_s_i_n_g _c_v_s_t_a_t_i_c _i_n _S_c_a_n_n_e_r _M_o_d_e _w_i_t_h
- _C++ _c_v_s_t_a_t_i_c analyzes C++ source code much more accurately
- in parser mode than in scanner mode. The following problems
- are known to occur in scanner mode. They can be avoided by
- following the workaround suggestions, or by using parser
- mode.
-
- +o _c_v_s_t_a_t_i_c does not do macro expansion, so classes based
- on macros used to simulate C++ parameterized types are
- not detected.
-
- +o _c_v_s_t_a_t_i_c does not completely handle function calls made
- through function pointers, in C or C++. In C++, this
- includes calls to member functions made through object
- pointers. For example, consider the following code
- segment:
-
- ssssaaaammmmpppplllleeeeffffuuuunnnnccccttttiiiioooonnnn (((())))
- {{{{
- AAAA ****oooobbbbjjjjeeeecccctttt1111 ==== nnnneeeewwww AAAA(((())));;;;
- BBBB ****oooobbbbjjjjeeeecccctttt2222 ==== nnnneeeewwww BBBB(((())));;;;
- oooobbbbjjjjeeeecccctttt1111---->>>>ffffuuuunnnncccc(((())));;;;
- oooobbbbjjjjeeeecccctttt2222---->>>>ffffuuuunnnncccc(((())));;;;
- }}}}
-
- In this example, _c_v_s_t_a_t_i_c correctly reports that
- samplefunction() calls func() two times. However, it
-
-
-
-
-
-
-
-
-
-
-
- - 26 -
-
-
-
- cannot determine that these two function calls are
- actually made to two different member functions,
- implemented by two different classes. Similarly,
- _c_v_s_t_a_t_i_c does not know about the _t_h_i_s pointer.
-
- Workaround: Don't try to display full function call
- trees for C++. Instead use queries like ``Who Calls
- <function>''or ``Who Is Called By <function>'' which
- produce meaningful results.
-
- +o _c_v_s_t_a_t_i_c does not understand overloaded functions.
-
- Workaround: Use the text view for all queries involving
- overloaded functions.
-
- +o C++ allows extensive use of operator overloading, which
- allows you to write code that can obscure what is
- really happening in the code. Because _c_v_s_t_a_t_i_c is
- designed around a pattern matcher, novel constructs
- produced by overloading operators are not normally
- detected. Constructs that conform to normal language
- conventions should normally be found. For example, if A
- and B are objects, and the ``='' operator has been
- overloaded to indicate an assignment of the contents of
- object B to the contents of object A, _c_v_s_t_a_t_i_c should
- be able to handle this situation. However, if some
- unusual overloading conventions have been used (say,
- using ``[]'' to mean a function call), _c_v_s_t_a_t_i_c does
- not show the same results as the C compiler.
-
- Workaround: If you have such code, use string or
- regular expression searches, or symbol searches to find
- what you are looking for.
-
- +o C++ programs containing templates are not well
- understood by scanner mode.
-
- Workaround: Use parser mode.
-
- 5.5.5 _K_n_o_w_n__p_r_o_b_l_e_m_s__U_s_i_n_g__c_v_s_t_a_t_i_c__w_i_t_h__F_o_r_t_r_a_n
-
- +o Problem: cvstatic changes case in source files.
-
- Workaround: For best results, ignore case:
-
- Because the Fortran compilers translate Fortran
- programs to lower (for Fortran 77) or upper (for
- Fortran 90) case when analyzing them, you may have
- trouble selecting a symbol name from the Source View
- and then using the selection as the target of a query.
- Therefore, when using the Static Analyzer on Fortran
-
-
-
-
-
-
-
-
-
-
-
- - 27 -
-
-
-
- sources, it is best to select the Ignore Case option,
- either through the General Option menu, or persistently
- through the use of the X resource mechanism thus:
-
- cvstatic*ignoreCase: True
-
- +o Problem: Fortran file suffixes are ambiguous.
-
- Workaround: Tell cvstatic what suffixes you use for
- which Fortran variant.
-
- Both Fortran 77 and Fortran 90 accept files with the
- the suffixes .f and .F. So, there is no obvious way
- for the Static Analyzer to tell whether a source file
- is Fortran 77 or Fortran 90.
-
- To indicate that you want a particular suffix to
- correspond to a particular language, you can set the
- suffixSource X resource before running cvstatic. For
- example:
-
- *suffixSource: C++.c++ C++.C C++.cxx C++.h C.c
- Fortran.f Fortran90.F Fortran90.f90
-
- This line in your .Xdefaults file indicates that you
- want files ending .f to be analyzed as Fortran 77
- codes, while files ending .F or .f90 are Fortran 90.
-
- You may want to analyze a set of files in which some
- files ending .f are Fortran 77 while other files with
- the same suffix are Fortran 90. If so, the only way to
- distinguish them is for you manually to edit the
- cvstatic.fileset file and make sure that each filename
- is followed by the correct driver. For example, these
- two lines in the fileset file indicate that foo.f is a
- Fortran 77 file, while bar.f is Fortran 90:
-
- ////uuuussssrrrr////ppppeeeeoooopppplllleeee////yyyyoooouuuu////ffffoooooooo....ffff ffff77777777
- ////uuuussssrrrr////ppppeeeeoooopppplllleeee////yyyyoooouuuu////bbbbaaaarrrr....ffff ffff99990000
-
- _c_v_s_t_a_t_i_c analyzes Fortran source code much more accurately
- in parser mode than in scanner mode. The following problems
- are known to occur in scanner mode. They can be avoided by
- following the workaround suggestions, or by using parser
- mode.
-
- +o _c_v_s_t_a_t_i_c occasionally misses function calls and other
- statements that directly follow an _i_f statement on the
- same line.
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 28 -
-
-
-
- +o _c_v_s_t_a_t_i_c uses a pattern matching approach. This
- approach does not allow the tool to detect the
- irregular use of spaces within Fortran symbols, even
- though these are allowed by the Fortran compiler. For
- example, the Fortran compiler accepts the statement:
-
- ssssuuuubbbb rrrroooouuuuttttiiiinnnneeee mmmmyyyy
- 1111ffffuuuunnnncccc ttttiiiioooonnnn
-
- as if it were written:
-
- ssssuuuubbbbrrrroooouuuuttttiiiinnnneeee mmmmyyyyffffuuuunnnnccccttttiiiioooonnnn
-
- _c_v_s_t_a_t_i_c does not handle such conventions.
-
- Workaround: None in scanner mode. Silicon Graphics
- strongly suggests changing such code to use a more
- readable coding style.
-
- +o _c_v_s_t_a_t_i_c does not support the use of Fortran keywords
- for uses other than their intrinsic function. For
- example, _c_v_s_t_a_t_i_c always recognizes word ``if'' as
- starting a conditional statement. Programs that use
- ``if'' as a variable or function name are not analyzed
- correctly.
-
- Workaround: None in scanner mode. Silicon Graphics
- strongly suggests changing such code to use a more
- readable coding style.
-
- +o In some situations, _c_v_s_t_a_t_i_c can mistake references to
- arrays as function calls. This is particularly true
- when the Fortran code relies on include files to
- declare arrays, common blocks, and so on. _c_v_s_t_a_t_i_c does
- not analyze header files at the point at which they
- occur, but simply adds them to the list of files to be
- analyzed. This contributes greatly to the speed of
- _c_v_s_t_a_t_i_c, but means that _c_v_s_t_a_t_i_c does not have various
- type declarations available to it. Because Fortran
- arrays cannot be differentiated from function calls
- without a declaration, _c_v_s_t_a_t_i_c identifies arrays not
- defined in the file in which they are referenced as
- function calls.
-
- Workaround: Use the Results Filter to exclude
- ``external'' functions. This limits all queries to
- those functions actually defined in the fileset.
- Excluding external functions hides all array references
- erroneously identified as function calls, but also
- hides all calls to library functions, intrinsic
- functions, or other routines declared outside the
-
-
-
-
-
-
-
-
-
-
-
- - 29 -
-
-
-
- fileset.
-
- 5.5.6 _K_n_o_w_n__P_r_o_b_l_e_m_s__U_s_i_n_g__c_v_s_t_a_t_i_c__i_n__P_a_r_s_e_r__M_o_d_e
- Sometimes the General query "Where Symbol Used" fails
- to report some call sites, if the target of the query
- was a function.
-
- WorkAround: Use the Function query "Who Calls" or
- "Where Function Used" to get a complete list of places
- wehre the target function is called or otherwise used.
-
- +o The query Where Type Used may return duplicate results
- in C and C++ programs. For example, asking Where Type
- Used Foo will produce two copies of the result showing
- the definition of the symbol
-
- FFFFoooooooo ffff;;;;
-
- If one of these locations is shown without a function
- field and one is shown with a function, the latter is
- correct.
-
- Workaround: If you are explicitly looking for
- definitions, use the queries List Data of Type or List
- Functions of Type instead. Otherwise, just ignore the
- duplications.
-
- +o The query Where Type Used is confusing about pointers
- in C and C++.
-
- If you ask Where Type Used about a user-defined type
- named Foo, the query will display all uses of Foo,
- including uses of types like Foo*, Foo**, Foo[], etc.
-
- But if you ask Where Type Used about a built-in type
- like void or char, the query will display only uses of
- that exact type.
-
- Workaround: Query explicitly about typenames like
- void*, char**, etc, that contain no user-defined
- typenames.
-
- +o Queries on "integer" and "real" in fortran don't work.
-
- Fortran reports integer types as having typenames I*4
- and I*8, real types with typenames R*4, R*8, complex
- types with typenames CM*8 and CM*16, and logical types
- as L*4.
-
- Workaround: To inquire about uses and declarations with
- these types, enter I*4 (or whatever) into the target
-
-
-
-
-
-
-
-
-
-
-
- - 30 -
-
-
-
- field instead of "integer".
-
- +o Mismatched member function declarations and definitions
- are not recognized by _c_v_s_t_a_t_i_c'_s parser. The parser
- runs into trouble processing a member function if the
- signature of its declaration and definition are not
- identical. For example, if the code contains something
- like this:
-
- ttttyyyyppppeeeeddddeeeeffff iiiinnnntttt**** iiiinnnnttttppppttttrrrr;;;;
-
- ccccllllaaaassssssss AAAA {{{{
- ppppuuuubbbblllliiiicccc::::
- AAAA ((((iiiinnnntttt **** iiii))));;;;
- }}}};;;;
-
- AAAA::::::::AAAA ((((iiiinnnnttttppppttttrrrr iiii)))) {{{{
- }}}}
-
- the parser will print the error message "no record for
- method A::A?" and terminate processing of the file.
-
- Workaround: analyze code like this in scanner mode, or
- change the type signatures so that the definition and
- declaration match.
-
- +o _c_v_s_t_a_t_i_c's parser mode is better at building a new
- database than at modifying an existing one. If you
- build a parser-mode database and then change a file and
- reparse it, the database will grow each time you rescan
- the file. Not all space is reclaimed. Additional arcs
- may appear in the Call Tree view representing defunct
- call site information.
-
- Workaround: After a few files are modified and re-
- analyzed, it is best to use Force Scan to rebuild the
- entire parser-mode database. For a large code base that
- is slow to parse, you can use the -batch flag to
- rebuild the database overnight.
-
- +o Functions generated by templates are recognized and
- displayed by _c_v_s_t_a_t_i_c, but it treats them as external
- functions: functions that are declared or used within
- the fileset but are not defined there. Consequently,
- they do not appear in the results of the ``Query List
- All Functions''.
-
- Workaround: Use specific queries about these functions,
- like ``Where Function Called'', or add them manually to
- Call Tree graphs.
-
-
-
-
-
-
-
-
-
-
-
-
- - 31 -
-
-
-
- +o The function "main" appears in the list of Functions
- Not Called, if it is not called explicitly from the
- source code. ("main" is rarely called explicitly.)
-
- Workaround: You can add the function "main" manually to
- any graphical display of functions.
-
- +o Graphical display of a single member function called
- through derived classes is incomplete. If a C++ member
- function FFFFoooooooo::::::::FFFFuuuunnnncccc is called through classes derived
- from the ccccllllaaaassssssss FFFFoooooooo, each derived function FFFFuuuunnnncccc will
- appear as a separate function in the Text View list of
- functions. However, only one node will appear for FFFFuuuunnnncccc
- in the Call Tree View.
-
- Workaround: To see the full list of definitions and
- calls of FFFFuuuunnnncccc, use Text Mode. If you double click on
- the definition of one of the derived FFFFuuuunnnnccccs, you will
- navigate either to the definition of the function (if
- you click on the version in FFFFoooooooo), or to the definition
- of the derived class through which FFFFuuuunnnncccc was called.
-
- +o If you are analyzing C++ code in which multiple non-
- member functions have the same name, _c_v_s_t_a_t_i_c will
- think they are all the same function with one
- definition and several declarations.
-
- Workaround: You can get to the definitions by using the
- ``Where Defined'' and ``Where Declared'' queries on
- functions.
-
- +o When you first bring up _c_v_s_t_a_t_i_c, if you switch the
- view from Text View to a graph view before building the
- parser database and doing your first query, the graph
- may incorrectly display as empty.
-
- Workaround: Stay in Text View to perform your first
- query, and then switch to whichever graph view you
- wish. Or, if you have already brought up _c_v_s_t_a_t_i_c in a
- graph view and built the database, hit ``Rescan'' in
- the Admin menu, and then redo your query.
-
-
- 5.6 _W_o_r_k_S_h_o_p__C_+_+__B_r_o_w_s_e_r
-
- +o The _C++ _B_r_o_w_s_e_r currently works only on files in the
- parser fileset. So if you have a fileset which has
- only files in the scanner fileset, the browser will not
- work. To generate the database, you have to put files
- in the parser fileset and issue a rebuild in _c_v_s_t_a_t_i_c.
- Once the database is created you can use Browser to
-
-
-
-
-
-
-
-
-
-
-
- - 32 -
-
-
-
- examine the C++ classes.
-
- +o When using the C++ Browser, if you make changes to the
- code in the files that are present in the fileset, the
- changes will not be reflected in the information
- presented by the C++ Browser until you issue a Rescan
- command in _c_v_s_t_a_t_i_c, as follows:
-
- * Make your changes.
-
- * Exit the C++ Browser (but not cvstatic).
-
- * Issue a FFFFoooorrrrcccceeee SSSSccccaaaannnn from the cvstatic AAAAddddmmmmiiiinnnn menu.
-
- * Restart the browser by selecting AAAAddddmmmmiiiinnnn/CCCC++++++++ BBBBrrrroooowwwwsssseeeerrrr
- menu in cvstatic.
-
- Incident 186990.
-
- +o When using the C++ browser, if you create and close (or
- quit) the Class Graph or Call Graph windows many times,
- some times you may find that it will make the tool core
- dump or exit with X errors. This is due to some known
- defects in deletion of widgets in Xm and Sgm.
-
- Incident 204472.
-
- +o Duplicate class definitions encountered in your files
- in the parser fileset will end up as a single class
- with accumulating members from both the definitions.
- This happens when the file defining the class is
- included from two different paths or there are two
- genuine class definitions for the same class name in
- your fileset.
-
- Incident 206922.
-
- +o If you use typedefs, and use it to give alternate names
- to classes (as in _t_y_p_e_d_e_f _c_l_a_s_s _A _B;) - you may that
- the Build Window shows some warnings about not finding
- the class B and that the information collected about
- the usage of class A will be missing many of the
- references through its typedef B.
-
- This kind of typedef is more commonly found in template
- code. There is no good workaround currently, other than
- not using the typedef in question.
-
- Incident 217830.
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 33 -
-
-
-
- +o If you use typedefs, and use it inconsistently in
- declaring and defining class members (as in the
- following example), you will find that information
- regarding those members is either missing or faulty.
- The workaround is to use the same prototype at the
- point of definition as at the point of declaration.
-
- ttttyyyyppppeeeeddddeeeeffff iiiinnnntttt IIIINNNNTTTT;;;;
- ccccllllaaaassssssss AAAA {{{{
- vvvvooooiiiidddd ffffoooooooo ((((IIIINNNNTTTT))));;;;
- }}}};;;;
-
- vvvvooooiiiidddd AAAA::::::::ffffoooooooo ((((iiiinnnntttt vvvvaaaallll)))) ............ //////// ggggeeeettttssss wwwwaaaarrrrnnnniiiinnnngggg,,,, aaaannnndddd iiiissss mmmmiiiissssssssiiiinnnngggg
- //////// ffffrrrroooommmm ssssttttaaaattttiiiicccc aaaannnnaaaallllyyyyssssiiiissss iiiinnnnffffoooo....
-
- Incident 184455.
-
- +o Usage information for template classes is managed only
- on a per-instantiation basis. If you use templates in
- your code, then each instantiation, and the template
- itself, will show up as classes in the C++ Browser.
-
- For instance, if you have a template class Foo<T>, then
- there will be a class called FOO<T> and classes FOO<A>,
- FOO<B> etc., for the template definition prototype of
- FOO and its instantiations with A, B, etc.,
- respectively. And the usage information on FOO<T>
- currently shown is not the amalgamation of usage
- information on its instantiations FOO<A>, FOO<B>, etc.
-
- +o Be careful about overwriting man pages which are
- generated using the automatic class man page generation
- facility.
-
- When you generate a manpage for a class, through the
- C++ browser, you get a skeleton, in which you have to
- fill in all the descriptions. Please remember that if
- you change the class and generate a new man page for
- that class again, your changes to the file will be lost
- if you ignore the man page overwrite warning dialog.
-
- To avoid losing your changes to a manpage file
- generated by C++ Browser do the following:
-
- * Move the existing manpage out of the way to some
- other file.
-
- * Generate the new (skeleton) man page.
-
- * Merge the changes from the saved file to the new
- man page generated by the C++ Browser.
-
-
-
-
-
-
-
-
-
-
-
- - 34 -
-
-
-
- +o When you use an application which allocates lot of
- colors in the default color map and then use cvstatic
- or C++ browser to bring up graphs, you might get all
- black nodes with un-readable text. The only known
- workaround to this problem is to kill the X server and
- login again. Be sure that you bring up cvstatic before
- you bring up the offending application. This problem
- has been seen with viewing books which have full color
- pictures.
-
-
- 5.7 _W_o_r_k_S_h_o_p__P_e_r_f_o_r_m_a_n_c_e__A_n_a_l_y_z_e_r
-
- +o On some systems with 16K or larger pages size, some
- versions of libXm.so.1 when instrumented for PC
- sampling, can not be loaded. Try using SpeedShop's PC
- sampling instead (Incident #515045).
-
- +o On some systems, libgl.so will crash when instrumented
- for PC sampling. Try using SpeedShop's PC sampling
- instead (Incident #515048).
-
- +o _c_v_p_c_s may core dump when profiling Ada applications
- (Incident #478331).
-
- +o Instrumentation may generate an incorrect file name for
- instantiated templates from C++ (Incident #284412).
-
- +o Ideal-time and CPU-time experiments on programs that do
- dlopen's may fail on R5K Indy machines, due to a HW bug
- that causes traps to be missed the first time through.
- The recording of performance experiments relies on an
- internal trap to dlopen in order to instrument the DSO
- being dlopen'd (Incident #439770).
-
- +o Total-time and bottleneck experiments will overcount
- inclusive time for recursive functions (Incident
- #438591)
-
- +o Running the Bottleneck and Total-Time experiments
- significantly slow the execution of some programs
- because of the time it takes to unwind the stack.
-
- +o _c_v_p_e_r_f is not backwards-compatible with experiments
- recorded on prior WorkShop releases, and will typically
- core dump on them.
-
- +o Instrumenting _l_i_b_c with the PC-sampling option will
- fail in IRIX 5.3 because there is not enough address
- space left for text and data sections (Incident
- #223912). These experiments work in IRIX 6.2 or later.
-
-
-
-
-
-
-
-
-
-
-
- - 35 -
-
-
-
- Workaround: There is no workaround for this problem on
- IRIX 5.3.
-
- +o Memory leak experiments on programs that fork may
- produce misleading data. For example, a child process
- may free a block allocated in the parent, which will
- appear as a bad free. (Incident #202710)
-
- +o During data collection, the collector, _c_v_m_o_n, might run
- out of disk space. In this case, it posts an error
- pop-up to the effect of ``bead write failed: no space
- left on device''.
-
- Workaround: Exit the debugger, free up sufficient space
- on the disk, and start the run again.
-
- +o The Performance Analyzer does not support COFF
- executables.
-
- +o The Performance tools can collect a great deal of data,
- and easily fill a disk. For typical programs, basic-
- block sampling can collect between 0.25 and 2 Mbytes of
- data at each sample point. PC sampling data can amount
- to between 0.25 and 6 Mbytes for each sample.
-
- Workaround: Use care in specifying how many samples you
- take to avoid this problem. Be especially careful in
- using Pollpoint sampling; it should normally be used
- collecting only callstacks, not function counts,
- basic-block counts, or PC sampling data. Sampling is
- not expensive in tracing experiments.
-
- +o The Main View has a notion of a default trap that is a
- stop trap if data collection has not been enabled in
- the Performance Panel (where ``enabled'' means after
- _A_c_c_e_p_t or _O_K was clicked), and a sample trap if it has
- been enabled. This setting is independent of the
- default trap set in the Trap Manager. Clicking in the
- margin of the MainView source window sets or clears the
- MainView default trap, and does not affect a trap of
- the other type.
-
- +o _m_a_l_l_o_c/_f_r_e_e traces can be quite voluminous and
- difficult to process in Heap View. When doing
- _m_a_l_l_o_c/_f_r_e_e tracing, be careful to design your
- experiments to exercise only those regions of your code
- that are problematic, and minimize the amount of trace
- data collected. It is difficult to estimate the volume
- of data produced. Each event writes 20 to 80 bytes, or
- more, depending on the depth of the callstack at the
- time of the call. A 10-minute experiment with the
-
-
-
-
-
-
-
-
-
-
-
- - 36 -
-
-
-
- WorkShop Performance Analyzer wrote 140 Mbytes of trace
- data. Reading this experiment took ~12 minutes on a
- 256-MB Onyx machine.
-
- +o The WorkShop Performance Analyzer can record
- experiments on MP FORTRAN programs, but there are a
- number of anomalies in the displayed data that require
- explanation. For all FORTRAN MP compilations, parallel
- loops within the program are represented as subroutines
- with names relating to the source routine in which they
- are embedded. The naming conventions for these
- subroutines are different for o32-bit, N32, and 64-bit
- compilations. In the linpack benchmark, most of the
- time spent is in the source routine _D_A_X_P_Y, which can be
- parallelized. The MP loop-body routines are invoked
- indirectly from the original function, and will show up
- as directly calls from a routine name __mp_parallel_do.
-
- When compiled with the 7.2 compilers, in either 64-
- bits, or n32, the MP loop-body routine is named
- "__mpdo_daxpy_1", and the function is named "daxpy_".
- However, there is a test in the compiled loop to
- determine if the work to be done is sufficient to be
- worth running in parallel. That means if the test
- succeeds, time will be shown in the routine
- __mpdo_daxpy_1, while if the test fails, the time will
- be recorded in the routine daxpy_.
-
- In an o32-bit version, the _D_A_X_P_Y routine is named
- "daxpy_", and the MP loop body routine
- "_daxpy_519_aaab_".
-
- In all three cases, for an ideal time experiment on a
- uniprocessor -_g run, the inclusive and exclusive
- function level times are correct. The source
- annotations, however, behave differently and
- incorrectly in most cases.
-
- With the 7.2 or 6.x compilers, source annotations for
- the exclusive time are correctly shown for each line,
- but the inclusive time for the first line of the loop
- (_d_o statement) includes the time spent in the loop
- body. This same time appears on the lines comprising
- the loop's body, in effect, representing a double-
- counting. When used in conjunction with WorkShop Pro
- MPF's Parallel Analyzer View, the loop performance data
- will incorrectly also reflect the double counting, and
- the time will not be always shown as a percentage:
- whenever it would exceed 100%, it is shown as <_n/_a>.
- The numerical time value shown reflects the double
- counting.
-
-
-
-
-
-
-
-
-
-
-
- - 37 -
-
-
-
- In 32-bit source annotations, the exclusive time is
- incorrectly shown for the line comprising the loop's
- body, as the line-level data for the loop-body routine
- ("_daxpy_519_aaab_") does not refer to proper lines.
- If the program was compiled with the -_m_p__k_e_e_p flag, the
- line-level data should refer to the temporary files
- that are saved from the compilation, but the temporary
- files do not contain that information, so no source or
- disassembly data can be shown. The disassembly data
- for the main routine does not show the times for the
- loop-body.
-
- If the 32-bit program was compiled without -_m_p__k_e_e_p,
- the line-level data for the loop-body routine is
- incorrect, with most lines referred to line 0 of the
- file, and the rest to other lines at seemingly random
- places in the file. Consequently, spurious annotations
- will appear on these other lines. Disassembly
- correctly shows the instructions, and their data, but
- the line numbers shown are wrong. MPF's Parallel
- Analyzer correctly shows the loop data in most cases,
- but the same incorrect line numbers can cause data
- relating to one loop to show up in other parts of the
- program. This reflects what is essentially the same
- double-counting problem as seen in 64-bits, but the
- extra counts go to other places in the file, rather
- than the first line of the loop.
-
- NNNNOOOOTTTTEEEE:::: We recommend against using the -_m_p__k_e_e_p flag.
-
- +o For MP experiments, switching between threads will
- cause the calipers to change to points valid for the
- new thread. Switching back may use different points,
- and therefore, show different numbers. Set the calipers
- manually after switching to ensure proper placement.
-
- +o For MP experiments, stopping one thread can cause the
- notion of time in other threads to get confused. It is
- not recommended.
-
- +o The inclusive data shown in _c_v_p_e_r_f represents the
- instruction counts and/or PC sampling data summed over
- the routine and those routines that it calls. The
- computations are based on a heuristic that assumes that
- all calls from all callers are equivalent. For
- programs where this heuristic is not applicable, for
- example, where one call to a matrix-multiply routine is
- for matrices of order four, while a second call is for
- matrices of order 100, the cumulative data may be
- misleading.
-
-
-
-
-
-
-
-
-
-
-
-
- - 38 -
-
-
-
- +o Line-level data assigns a value to a line equal to the
- highest value for any instructions attributed to that
- line. It can be confusing, because compiler
- optimizations often rearrange the code in ways that is
- non-obvious. Looking at a disassembly view of the data
- can help.
-
- +o Line-level data from assembler routines can be
- misleading. The symbol table often has instructions
- attributed to the wrong source line.
-
- +o In some cases, line number data for a C++ routine that
- uses inline virtual functions defined in an included
- file gets the line numbers incorrectly displayed as if
- they came from the file in which the defining file is
- included. This causes incorrect line-level data to
- show at the lines in the original file. The
- Disassembly View in _c_v_p_e_r_f shows performance data for
- each instruction, and may help disambiguate attribution
- (Incident #433284).
-
- +o _c_v_p_e_r_f filters out nodes and arcs that were not
- executed during the current caliper setting. This
- feature can lead to confusing displays, where nodes
- that are known to be in the program do not appear.
-
- Workaround: The Preferences menu can be used to disable
- the filtering.
-
- +o _c_v_p_e_r_f does not support live performance experiments.
- That is, you should not bring up _c_v_p_e_r_f until the
- experiment is over. If you do, it will not update as
- more data is recorded.
-
- +o Performance experiments on multi-process applications
- can occasionally be unreliable if sample events are
- quickly preceded by process creation, or succeeded by
- process termination.
-
- +o Heap View scrolls poorly and blocks flash on large
- experiments. Its functionality has been mostly
- subsumed by Leak View, Malloc View, and Malloc Error
- View. (Incident# 67628)
-
- +o Callstacks may be wrong in MP experiments. (Incident#
- 189826)
-
- +o Pollpoint sampling will fail if the target process
- forks, and the parent exits before the child.
- (Incident #186429)
-
-
-
-
-
-
-
-
-
-
-
-
- - 39 -
-
-
-
- +o The Performance Analyzer can dump core when computing
- line-level annotations on o32 programs.
-
- Workaround: Exit _c_v_d and call _c_v_p_e_r_f directly.
-
-
- 5.8 _W_o_r_k_S_h_o_p__T_e_s_t_e_r
-
- 5.8.1 _W_o_r_k_S_h_o_p__T_e_s_t_e_r__L_i_m_i_t_a_t_i_o_n_s
-
- +o Instrumented programs can increase in size by a factor
- of 2X to 5X. However, DSO caching and sharing
- alleviates this problem greatly.
-
- +o Block and branch coverage are at the assembly language
- level. They can provide useful metrics and do map back
- to the source lines. Note that several assembly branch
- instructions may map back to the same source line. To
- see the C, C++, and Fortran source level blocks and
- branches, use _c_v_c_o_v _l_s_s_o_u_r_c_e.
-
- +o Compilation with the debug flag -_g builds assembly
- language branches and blocks that can never be
- executed. This adversely affects overall coverage. By
- compiling with "O1" (the default), some of the unused
- assembly branches and blocks are not built. This gives
- a more accurate block and branch coverage metric.
- Function and arc coverage are unaffected by compile
- flags.
-
- +o C++ in-line functions are not counted as functions
- unless they are out-of-lined by the compiler.
-
- +o By default, arguments of functions are not displayed in
- query results. This can be confusing for C++
- overloaded functions because there is no way to
- distinguish between them. To work around this problem,
- use the -_a_r_g option to show full function signatures.
-
- +o The default size of the SourceView annotation canvas
- may not be large enough to hold very large counts. The
- resource name for setting canvas width for SourceView
- is "canvasWidth". The default value is 60. The user
- can modify this width by modifying the following
- resource found in the Cvxcov app-defaults file,
- "Cvxcov*test*testData*canvasWidth".
-
- +o _T_e_s_t_e_r currently uses object level instrumentation.
- This has several advantages:
-
- ((((1111)))) CCCCoooovvvveeeerrrraaaaggggeeee ddddaaaattttaaaa ccccaaaannnn bbbbeeee oooobbbbttttaaaaiiiinnnneeeedddd wwwwiiiitttthhhhoooouuuutttt aaaacccccccceeeessssssss ttttoooo tttthhhheeee
-
-
-
-
-
-
-
-
-
-
-
- - 40 -
-
-
-
- ssssoooouuuurrrrcccceeee ccccooooddddeeee....
- ((((2222)))) CCCCoooovvvveeeerrrraaaaggggeeee ddddaaaattttaaaa ccccaaaannnn bbbbeeee oooobbbbttttaaaaiiiinnnneeeedddd wwwwiiiitttthhhhoooouuuutttt rrrreeeeccccoooommmmppppiiiillllaaaattttiiiioooonnnn////rrrreeeebbbbuuuuiiiilllldddd....
- ((((3333)))) TTTThhhhiiiissss ssssuuuuppppppppoooorrrrttttssss CCCC,,,, CCCC++++++++,,,, aaaannnndddd FFFFoooorrrrttttrrrraaaannnn wwwwiiiitttthhhhoooouuuutttt ssssppppeeeecccciiiiaaaallll
- llllaaaannnngggguuuuaaaaggggeeee ssssuuuuppppppppoooorrrrtttt ffffrrrroooommmm tttthhhheeee ccccoooommmmppppiiiilllleeeerrrrssss....
-
- This has several disadvantages:
-
- ((((1111)))) BBBBlllloooocccckkkk aaaannnndddd bbbbrrrraaaannnncccchhhh ccccoooouuuunnnnttttssss aaaarrrreeee aaaatttt tttthhhheeee aaaasssssssseeeemmmmbbbbllllyyyy llllaaaannnngggguuuuaaaaggggeeee lllleeeevvvveeeellll....
- ((((2222)))) MMMMoooorrrreeee ddddeeeettttaaaaiiiilllleeeedddd ccccoooovvvveeeerrrraaaaggggeeee rrrreeeeqqqquuuuiiiirrrreeeessss kkkknnnnoooowwwwlllleeeeddddggggeeee ooooffff tttthhhheeee
- llllaaaannnngggguuuuaaaaggggeeee sssseeeemmmmaaaannnnttttiiiiccccssss.... FFFFoooorrrr eeeexxxxaaaammmmpppplllleeee,,,, hhhhaaaassss eeeevvvveeeerrrryyyy ppppoooossssssssiiiibbbblllleeee ccccaaaasssseeee
- iiiinnnn aaaa mmmmuuuullllttttiiiipppplllleeee ccccoooonnnnddddiiiittttiiiioooonnnnaaaallll ffffiiiirrrreeeedddd dddduuuurrrriiiinnnngggg tttteeeessssttttiiiinnnngggg....
-
- +o _W_e_a_k _e_x_t_e_r_n_a_l_s refer to an aliasing facility used by
- the compilation environment. For example, while user
- programs may call the function "read", the actual
- function name in the C library that implements "read"
- is "_read". In this case, "read" is a weak external for
- "_read". If the user CONSTRAINS coverage on either
- name, _T_e_s_t_e_r will report the results correctly.
- However, _T_e_s_t_e_r will choose the name used to implement
- the function, in this case "_read".
-
- +o -_f_u_n_c__p_a_t_t_e_r_n is a function pattern used in the
- following _c_v_c_o_v subcommands: _l_s_b_l_o_c_k, _l_s_b_r_a_n_c_h, _l_s_f_u_n,
- _l_s_t_r_a_c_e. Currently, only the following "patterns" are
- matched.
-
- """"DDDDSSSSOOOO::::****"""" -------- aaaallllllll ffffuuuunnnnccccttttiiiioooonnnnssss iiiinnnn aaaa DDDDSSSSOOOO
- DDDDSSSSOOOO::::ffffuuuunnnnccccttttiiiioooonnnn____nnnnaaaammmmeeee -------- ssssppppeeeecccciiiiffffiiiicccc ffffuuuunnnnccccttttiiiioooonnnn iiiinnnn aaaa DDDDSSSSOOOO
- ffffuuuunnnnccccttttiiiioooonnnn____nnnnaaaammmmeeee -------- ffffuuuunnnnccccttttiiiioooonnnn____nnnnaaaammmmeeee iiiinnnn mmmmaaaaiiiinnnn pppprrrrooooggggrrrraaaammmm aaaannnndddd ddddssssoooo''''ssss
- <<<< ooooppppttttiiiioooonnnn nnnnooootttt uuuusssseeeedddd >>>> -------- aaaallllllll ffffuuuunnnnccccttttiiiioooonnnnssss aaaarrrreeee iiiinnnncccclllluuuuddddeeeedddd iiiinnnn qqqquuuueeeerrrryyyy
-
- +o Sharing of the WorkShop Performance Analyzer
- performance experiment data is supported in _c_v_c_o_v but
- not in _c_v_x_c_o_v of this release.
-
- +o Output of query results to a printer is not supported
- in this release. As a workaround, the user can save
- query results to a file, and then send that file to a
- printer.
-
- +o Experiment data for test sets/test groups cannot be
- moved/copied (mv, cp) without invalidating the data.
- Leaf tests can be moved/copied.
-
- +o Both the _l_s_t_r_a_c_e feature (argument tracing) and the
- _l_s_s_o_u_r_c_e feature (mapping block counts to actual
- source) require the code to be compiled with -_g. A
- notable exception to this is return value tracing which
- can trace the return value on functions that are not
- compiled with -_g (e.g., _l_i_b_c functions).
-
-
-
-
-
-
-
-
-
-
-
- - 41 -
-
-
-
- +o _c_v_c_o_v requires that all instrumentation be performed
- before the experiment is run. This includes
- instrumentation for programs that are forked/exec'ed or
- sproc'ed. _c_v_m_o_n is the program used by _c_v_c_o_v to
- monitor the experiment. If _c_v_m_o_n encounters child
- processes, and the coverage experiment includes any
- executables other than the main program, then _c_v_m_o_n
- will instrument the executables for the child processes
- "on the fly". _c_v_c_o_v will not process coverage for
- these "on the fly" instrumented executables, because
- _c_v_m_o_n has not used the correct coverage instrumentation
- criteria. This can cause performance and space
- overhead.
-
- +o IRIX 5.1 and later binaries are supported (no support
- for IRIX 4.0.X binaries) including shared and
- nonshared.
-
- +o Instrumentation criteria ccccoooouuuunnnnttttssss must at least include
- ----bbbbbbbbccccoooouuuunnnntttt. For example, if user want to test function
- pointers the instrumentation file must contain the
- following line,
-
- CCCCOOOOUUUUNNNNTTTTSSSS ----bbbbbbbbccccoooouuuunnnnttttssss ----ffffppppccccoooouuuunnnnttttssss
-
- +o The current model for running instrumented programs
- requires that a separate process (_c_v_m_o_n) monitor the
- programs that are undergoing coverage analysis. This
- requires existing test scripts to be modified in the
- following manner:
-
- oooolllldddd ssssccccrrrriiiipppptttt::::
- #### pppprrrrooooggggrrrraaaammmm aaaarrrrgggg1111 aaaarrrrgggg2222
- nnnneeeewwww ssssccccrrrriiiipppptttt::::
- #### ccccvvvvccccoooovvvv mmmmkkkktttteeeesssstttt ----ccccmmmmdddd """"pppprrrrooooggggrrrraaaammmm aaaarrrrgggg1111 aaaarrrrgggg2222"""" ----tttteeeessssttttnnnnaaaammmmeeee tttteeeesssstttt
- #### ccccvvvvccccoooovvvv rrrruuuunnnntttteeeesssstttt tttteeeesssstttt
-
- +o There is potentially a large amount of data that can be
- captured when running multiple tests for large
- programs. There are several options to the _r_u_n_t_e_s_t
- command that help manage this data.
-
- The -_n_o_a_r_c option is used to eliminate the capture of
- arc data in the experiment result (e.g., arc AB is
- equivalent to function A calls function B from line X).
- This significantly reduces the amount of overall count
- information for the test coverage result.
-
- The -_r_m_s_u_b option is used to retain the overall results
- for the top level test set or test group, not for the
- individual subtests. There are several interactions of
-
-
-
-
-
-
-
-
-
-
-
- - 42 -
-
-
-
- the -_r_m_s_u_b and -_s_u_m options worth noting. If the
- -_r_m_s_u_b option is used, a subsequent "runtest" using the
- -_s_u_m option will not accumulate the counts data for
- these two runs. In this case only the second run will
- be in the top level test set/test group. The -_s_u_m
- option will sum up data only according to the count
- data that is in all the subtests currently and does not
- use the information in the top level test set or test
- group. When using the -_s_u_m and -_r_m_s_u_b options
- together, the count data will be accumulated and the
- subtest data will be deleted.
-
- The -_c_o_m_p_r_e_s_s option is used to compress experiment
- database using standard utility _c_o_m_p_r_e_s_s.
-
- The -_b_i_t_c_o_u_n_t option is used to convert experiment
- database to 1-bit-per-count format in recording
- experiment so that it will save disk space up to 32
- times. However, count number for basic blocks and
- branch coverage information will be lost.
-
- +o Source highlighting for statement that cover multiple
- lines only highlights the last line. This is due to a
- limitation in symbol table data generated by the
- compiler. For example, in the following source
- statement only the second line will be highlighted:
-
- pppprrrriiiinnnnttttffff((((""""TTTThhhhiiiissss iiiissss aaaa tttteeeesssstttt ffffoooorrrr %%%%ssss aaaatttt %%%%dddd"""",,,,
- 0000 tttteeeessssttttnnnnaaaammmmeeee,,,,wwwwhhhhiiiicccchhhhDDDDrrrriiiivvvveeee))));;;;
-
- +o If the DSO cache directory has been removed, all the
- existing experiments may be invalid and _T_e_s_t_e_r may not
- work.
-
- 5.8.2 _W_o_r_k_S_h_o_p__T_e_s_t_e_r__B_u_g_s
-
- +o Programs that use _a_r_g_v[_0] to build hardcoded filenames
- get confused by the renamed instrumented program (e.g.,
- <program> becomes <program_Instr>).
-
-
- 5.9 _W_o_r_k_S_h_o_p__E_n_v_i_r_o_n_m_e_n_t
-
- +o If the colors of your WorkShop windows look too dark to
- read or conversely if they look completely washed out,
- there may be a discrepancy between the gamma value you
- are using and the value your X server is using. The
- default value of gamma on installation is 1.7 but users
- running X programs may prefer a value of 1.0.
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 43 -
-
-
-
- Workaround: If you change your gamma value, by running
- the _g_a_m_m_a program (installed with _e_o_e_2._s_w._g_l_t_o_o_l_s),
- restart your X server.
-
- +o When starting up WorkShop, if you see the messages
-
- ////uuuussssrrrr////ssssbbbbiiiinnnn////ttttttttsssseeeessssssssiiiioooonnnn:::: CCCCaaaannnn''''tttt iiiinnnniiiitttt ttttyyyyppppeeee ddddaaaattttaaaabbbbaaaasssseeee....
- ////uuuussssrrrr////ssssbbbbiiiinnnn////ttttttttsssseeeessssssssiiiioooonnnn:::: eeeexxxxiiiittttiiiinnnngggg
- WWWWaaaarrrrnnnniiiinnnngggg:::: ttttttttsssseeeessssssssiiiioooonnnn:::: ssssiiiigggg____hhhhaaaannnnddddlllleeeerrrr:::: NNNNoooo cccchhhhiiiilllldddd pppprrrroooocccceeeesssssssseeeessss
- ////uuuussssrrrr////ssssbbbbiiiinnnn////ttttttttsssseeeessssssssiiiioooonnnn:::: CCCCaaaannnn''''tttt iiiinnnniiiitttt sssseeeerrrrvvvveeeerrrr....
- ttttttttsssseeeessssssssiiiioooonnnn:::: CCCCaaaannnn''''tttt iiiinnnniiiitttt ttttyyyyppppeeee ddddaaaattttaaaabbbbaaaasssseeee....
- ttttttttsssseeeessssssssiiiioooonnnn:::: eeeexxxxiiiittttiiiinnnngggg
- WWWWaaaarrrrnnnniiiinnnngggg:::: ttttttttsssseeeessssssssiiiioooonnnn:::: ssssiiiigggg____hhhhaaaannnnddddlllleeeerrrr:::: NNNNoooo cccchhhhiiiilllldddd pppprrrroooocccceeeesssssssseeeessss
- ttttttttsssseeeessssssssiiiioooonnnn:::: CCCCaaaannnn''''tttt iiiinnnniiiitttt sssseeeerrrrvvvveeeerrrr....
- TTTTttttuuuuttttiiiillll:::: CCCCaaaannnnnnnnooootttt ooooppppeeeennnn oooouuuurrrr TTTToooooooollllTTTTaaaallllkkkk pppprrrroooocccceeeessssssss iiiidddd
- ttttttttuuuuttttiiiillll:::: CCCCoooouuuullllddddnnnn''''tttt ccccoooonnnnnnnneeeecccctttt ttttoooo ttttttttsssseeeessssssssiiiioooonnnn sssseeeerrrrvvvviiiicccceeee((((ssss))))....
-
- check if you have the _C_E_P_A_T_H environment variable set.
- ToolTalk will use the _C_E_P_A_T_H variable for its
- definition of where the types database are located.
- WorkShop expects to find them in the default system
- database, /_e_t_c/_t_t/_t_y_p_e_s._x_d_r. Unsetting this environment
- variable will fix the startup problem.
-
- +o When starting up WorkShop, you may occassionally see
- the message
-
- ////uuuussssrrrr////ssssbbbbiiiinnnn////ttttttttsssseeeessssssssiiiioooonnnn:::: WWWWaaaarrrrnnnniiiinnnngggg:::: ccccoooouuuullllddddnnnn''''tttt aaaaccccqqqquuuuiiiirrrreeee XXXX sssseeeelllleeeeccccttttiiiioooonnnn
-
- ToolTalk displays this message when its internal state
- notes that someone else (i.e. another _t_t_s_e_s_s_i_o_n) has
- already owned the X selection that it is trying to
- aquire. This message is harmless and can be ignored.
-
- +o The network license mechanism used by WorkShop performs
- periodic checks to ensure that a license is available.
- Once obtained, a license is valid for 20 minutes. The
- license is validated every 10 minutes, and renewed for
- an additional 20 minutes if all is well. This process
- requires that WorkShop be actively running to be able
- to perform these checks. If the tool is unable to check
- the license server for 20 minutes, the license is lost,
- and the tool must be restarted to get a new license.
- Therefore, suspending a WorkShop process (using <Ctrl-
- Z>, for example) for more than a few minutes loses the
- tool's license.
-
- +o The WorkShop environment works with one configuration
- management system at a time. This affects all users
- running WorkShop on that machine.
-
-
-
-
-
-
-
-
-
-
-
-
- - 44 -
-
-
-
- +o The default for string data is to display it as a hex
- address. If you prefer the behavior of showing a
- string for _c_h_a_r *, you can set ****aaaauuuuttttooooSSSSttttrrrriiiinnnnggggFFFFoooorrrrmmmmaaaatttt to
- TTTTrrrruuuueeee in your ._X_d_e_f_a_u_l_t_s. This will automatically
- change the result format from the default to string for
- _c_h_a_r * and _c_h_a_r <_a_r_r_a_y> expressions in the
- ExpressionView, VarBrowser, and DataBrowser.
-
- +o Customers displaying to non-SGI X displays and having
- difficulties with ExecutionView startup (a busy cursor
- that never goes away) should try switching
- ****eeeexxxxeeeeccccuuuuttttiiiioooonnnnVVVViiiieeeewwww****TTTTeeeerrrrmmmmiiiinnnnaaaallllCCCCoooommmmmmmmaaaannnndddd in
- /_u_s_r/_W_o_r_k_S_h_o_p/_u_s_r/_l_i_b/_X_1_1/_a_p_p-_d_e_f_a_u_l_t_s/_C_v_m_a_i_n from the
- _x_w_s_h version to the commented out _x_t_e_r_m version.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-